package evaluation;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import classification.Model;
import classification.ModelBase;

import base.Base;
import base.Tweet;


/**
 * Classe permettant d'effectuer le test aveugle de notre classification
 * sur le fichier test.txt
 *
 */
public class Test {

	/**
	 * Le chemin du fichier train.txt permettant d'établir les statistiques de base
	 */
	private String filePath = "fichiers/train.txt";
	
	/**
	 * Les statistiques de base
	 */
	private Base base;
	
	/**
	 * L'objet ModelBase
	 */
	private ModelBase modelBase;
	
	/**
	 * L'objet Model
	 */
	private Model bernoulli;
	
	
	/**
	 * Constructeur d'un objet Test
	 */
	public Test()
	{
		System.out.println("Commencer de construire la base!");
		base = new Base(filePath);
		base.construireBase();
		
		modelBase = new ModelBase(false, false, true, 0, true, base);
		bernoulli = new Model(true, 0.222, 1);
		construireModel();
		System.out.println("Finir de construire la base!");
	}
	
	/**
	 * Construit l'apprentissage
	 */
	public void construireModel()
	{	
		/* On construit l'apprentissage */
		for (int j = 0; j < base.getNbTweets(); j++) {
			Tweet tweet = base.getTweet(j);
			String classType = tweet.getTypeClass();
			String message = tweet.getText();
			
			/* On supprime les caractères spéciaux */
			// Pattern p = Pattern.compile("[^0-9a-zA-Z]");
			Pattern p = Pattern.compile("[,.!?\":]");
			Matcher m = p.matcher(message);
			message = m.replaceAll(" ");
			
			modelBase.construireApprentissage(message, classType);
		}
		modelBase.finirBase();		
	}
	
	/**
	 * Renvoie le nom de la catégorie dans laquelle le message de tweet
	 * passé en paramètre a été classé
	 * 
	 * @param message
	 * 				le message du tweet
	 * @return le nom de la catégorie
	 */
	public String getClasse(String message)
	{
		/* On supprime les caractères spéciaux */
		// Pattern p = Pattern.compile("[^0-9a-zA-Z]");
		Pattern p = Pattern.compile("[,.!?\":]");
		Matcher m = p.matcher(message);
		message = m.replaceAll(" ");

		return bernoulli.obtenirClasse(message, modelBase);
	}
	
	/**
	 * Teste un fichier et écrit les résultats dans un autre
	 * 
	 * @param readFile
	 * 				le chemin du fichier à tester
	 * @param writeFile
	 * 				le chemin du fichier résultat
	 */
	public void test(String readFile, String writeFile)
	{
		try {
			System.out.println("Commencer de tester !");
			BufferedReader reader = null;
			FileInputStream fileRead = new FileInputStream(readFile); 
			InputStreamReader isr = new InputStreamReader(fileRead, "UTF-8"); 
			
			reader = new BufferedReader(isr);
			String tempStr = null;
			File fileWrite = new File(writeFile);
			FileWriter filewriter = new FileWriter(fileWrite, true);
			String result="";
			String[] temps = reader.readLine().split("\",\"");
			int textIndex=0;
			for(int i = 0; i < temps.length; i++)
			{
				temps[i]=temps[i].replace("\"", "");
				if(temps[i].compareTo("TweetText")==0)
				{
					textIndex = i;
					break;
				}
			}
			while ((tempStr = reader.readLine()) != null) {
				String[] valeurs = tempStr.split("\",\"");
				if(valeurs.length != temps.length)
					continue;
				
				String message = valeurs[textIndex];
				result = "\""+this.getClasse(message)+"\"\n";
				filewriter.write(result);
			}
			System.out.println("Finir de tester !");
			filewriter.close();
		} catch (IOException e) {

		} catch (Exception ex) {

		}
	}
	
	/**
	 * Main : 
	 * Fait le test aveugle avec le fichier test.txt
	 * et écrit les résultats dans le fichier Result.txt
	 * 
	 * @param args
	 */
	public static void main(String[] args)
	{
		Test test = new Test();
		if(args.length == 2)
		{
			test.test(args[0], args[1]);
		}
		else
		{
			System.out.println("Parametres in valide");
		}
	}
}
